#include <wx/app.h>
#include <wx/wx.h>
#include <wx/wxprec.h>
#include <string>
#include "FirstFrame.h"
using namespace std;
/**
 *  每一个wxWidgets程序都需要定义一个wxApp类的子类，并且需要创建并且只能创建一个这个类
 *的实例，这个实例控制着整个程序的执行。你的这个继承自wxApp的子类至少需要定义一个OnInit函
 *数，当wxWidgets准备好运行你写的代码的时候，它将会调用这个函数
 */
class OurApp:public wxApp
{
public:
    /**
     * 在这个OnInit函数中，通常应该作的事情包括: 创建至少一个窗口实例(实例是C++中的关键
     * 词)，对传入的命令行参数进行解析，为应用程序进行数据设置和其它的一些初始化的操作.如果这
     * 个函数返回真，wxWidgets将开始事件循环用来接收用户输入并且在必要的情况下处理这些输入。如
     * 果OnInit函数返回假，wxWidgets将会释放它内部已经分配的资源，然后结束整个程序的运行。
     * @return
     */
    bool OnInit()override
    {
        //wxT这个宏,让你的代码兼容Unicode模式,使用这个宏
        //也不会带来运行期的性能损失。
        //wxString title = wxT("第一个窗体");
        //wxFrame * frame = new wxFrame(nullptr, wxID_ANY, title);

        //创建并显示主窗口
        auto* frame = new FirstFrame(wxT("第一个窗体"));

        //动态进行事件映射，
        frame->Connect ( wxID_EXIT ,
                 wxEVT_COMMAND_MENU_SELECTED,
        wxCommandEventHandler ( FirstFrame::OnQuit ) );

        //果我们希望在某个时候中止上面的事件映射，可以使用下面的方法
/*
        frame->Disconnect( wxID_EXIT ,
                         wxEVT_COMMAND_MENU_SELECTED,
                         wxCommandEventHandler ( FirstFrame::OnQuit ) );
*/

        frame->Show();
        // 开始事件处理循环
        return true;
    }
};

//IMPLEMENT_APP 这个宏用于创建实例，当wxWidgets创建这个MyApp类的实例的时候，会将创建的结果赋值给一个全局变量wxTheApp.你
//当然可以在你的程序中使用这个变量，但是你可能不得不一遍又一遍的进行从wxApp到MyApp的类型
//强制转换。增加下面的这一行声明以后，你就可以调用wxGetApp()函数，这个函数会返回一个到这
//个MyApp实例的引用，这样用起来就方便多了。

// 有了这一行就可以使用 OurApp& wxGetApp了()
DECLARE_APP(OurApp)
//告诉主应用程序是哪个类wxWidgets（启动）
//IMPLEMENT_APP(OurApp)